﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;
using Boom.Navigation;

namespace Boom.GameObjects
{
    public class ListFire : DrawableGameComponent
    {
        private Vector2 _Position;
        private Texture2D _Texture;

        private List<Fire> _List;
        private bool _Left, _Right, _Top, _Bot;
        private List<int> _PositionBrick;
        private Rectangle _HoriFire;
        private Rectangle _VertiFire;
        private bool _CheckObs;

        private TimeSpan _Elapsed = TimeSpan.Zero;

        private int _Lenght;

        public List<Fire> List
        {
            get { return _List; }
            set { _List = value; }
        }

        public Vector2 Position
        {
            get { return _Position; }
            set { _Position = value; }
        }

        public int Lenght
        {
            get { return _Lenght; }
            set { _Lenght = value; }
        }

        public Rectangle HoriFire
        {
            get { return _HoriFire; }
        }

        public Rectangle VertiFire
        {
            get { return _VertiFire; }
        }

        public ListFire(Game Mygame, ref Texture2D Texture, int Lenght, List<int> PositionBrick, bool CheckObs)
            : base(Mygame)
        {
            _List = new List<Fire>();
            _Position = new Vector2();
            _Texture = Texture;
            _PositionBrick = PositionBrick;
            _Lenght = Lenght;
            _CheckObs = CheckObs;
            _Left = _Right = _Top = _Bot = true;
            Enabled = false;
        }

        //khởi tạo list lửa gồn ngang và dọc
        //Trong qúa trình tạo ra 1 ô mới nếu có va chạm với tọa độ ảo lửa sẽ không được thêm vào
        //biến tọa độ cục bộ đứng tại vị trí bị va chạm trước 1 ô so với lửa thật
        public void CheckNewFire()
        {
            int XLeft, XRight;
            int YTop, YBot;
            XLeft = XRight = (int)Position.X;
            YTop = YBot = (int)Position.Y;

            Vector2 FLeft = new Vector2();
            Vector2 FRight = new Vector2();
            Vector2 FTop = new Vector2();
            Vector2 FBot = new Vector2();

            Fire newCenter = new Fire(Game, ref _Texture, Position);
            List.Add(newCenter);

            for (int i = 0; i < Lenght; i++)
            {

                if (_Left && XLeft - 40 >= 0) XLeft -= 40;
                if (_Top && YTop - 40 >= 0) YTop -= 40;
                if (_Right && XRight + 40 < 600) XRight += 40;
                if (_Bot && YBot + 40 < 600) YBot += 40;

                FLeft = new Vector2(XLeft, Position.Y);
                FRight = new Vector2(XRight, Position.Y);
                FTop = new Vector2(Position.X, YTop);
                FBot = new Vector2(Position.X, YBot);

                //Tọa độ ảo xét độ dài lửa dọc và ngang
                if (_PositionBrick != null && _CheckObs)
                {
                    for (int j = 0; j < _PositionBrick.Count; j++)
                    {
                        //tọa độ Y của temp tượng trưng cho hàng, X tượng trưng cho cột của ma trận
                        Vector2 temp = new Vector2(_PositionBrick[j] % 15 * 40, _PositionBrick[j] / 15 * 40);

                        if ((FLeft.X == temp.X && FLeft.Y == temp.Y || XLeft < 0) && _Left)
                        {
                            _Left = false;
                        }

                        if ((FRight.X == temp.X && FRight.Y == temp.Y || XRight >= 600) && _Right)
                        {
                            _Right = false;
                        }

                        if ((FTop.X == temp.X && FTop.Y == temp.Y || YTop < 0) && _Top)
                        {
                            _Top = false;
                        }

                        if ((FBot.X == temp.X && FBot.Y == temp.Y || YBot >= 600) && _Bot)
                        {
                            _Bot = false;
                        }
                    }
                }
                if (_Left && XLeft >= 0)
                {
                    Fire newLeft = new Fire(Game, ref _Texture, FLeft);
                    List.Add(newLeft);
                }

                if (_Right && XRight < 600)
                {
                    Fire newRight = new Fire(Game, ref _Texture, FRight);
                    List.Add(newRight);
                }

                if (_Top && YTop >= 0)
                {
                    Fire newTop = new Fire(Game, ref _Texture, FTop);
                    List.Add(newTop);
                }

                if (_Bot && YBot < 600)
                {
                    Fire newBot = new Fire(Game, ref _Texture, FBot);
                    List.Add(newBot);
                }
            }
            _HoriFire = new Rectangle(XLeft, (int)Position.Y + 3, XRight - XLeft + 40, 32);
            _VertiFire = new Rectangle((int)Position.X + 3, YTop, 32, YBot - YTop + 40);
        }

        public override void Update(GameTime gameTime)
        {
            if (Enabled)
            {
                for (int i = 0; i < List.Count; i++)
                {
                    List[i].Update(gameTime);
                }

                _Elapsed += gameTime.ElapsedGameTime;
                if (_Elapsed > TimeSpan.FromMilliseconds(Config.TimeFire))
                {
                    Enabled = false;
                    Visible = false;
                }
            }
            else
            {
                for (int i = 0; i < List.Count; i++)
                {
                    List[i].Enabled = false;
                }
                List.Clear();
            }
            base.Update(gameTime);
        }

        public override void Draw(GameTime gameTime)
        {
            if (Enabled)
            {
                for (int i = 0; i < List.Count; i++)
                {
                    List[i].Draw(gameTime);
                }
            }
            base.Draw(gameTime);
        }

    }
}
